<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>聚合 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'search-aggregations.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/search-aggregations.html" rel="nofollow" target="_blank">../en/search-aggregations.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-node">聚合</span>
</div>
<div class="navheader">
<span class="prev">
<!--<a href="sql-limitations.html">« SQL Limitations</a>-->
<a href="regexp-syntax.html">« 正则表达式语法</a>
</span>
<span class="next">
<a href="search-aggregations-metrics.html">度量聚合 »</a>
</span>
</div>
<div class="part">
<div class="titlepage"><div><div>
<h1 class="title">
<a id="search-aggregations"></a>聚合 (aggregations)
</h1>
</div></div></div>
<div class="openblock partintro">
<div class="content">
<p>
聚合框架有助于提供基于搜索查询的聚合数据。

它基于被称为聚合(aggregations)的简单构建块，可以组合这些块来构建复杂的数据摘要。
</p>
<p>
聚合可以被看作是在一组文档上构建分析信息的<em title="unit-of-work">工作单元</em>。

执行的上下文定义了这个文档集是什么(例如，顶级的聚合在搜索请求的已执行的 query/filter 的上下文中执行)。
</p>
<p>
有许多不同类型的聚合，每种都有自己的目的和输出。

为了更好地理解这些类型，通常更容易将它们分为四大类：
</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<a class="xref" href="search-aggregations-bucket.html" title="bucket 聚合" rel="nofollow"><em>Bucketing</em></a>
</span>
</dt>
<dd>
构建桶(bucket)的一系列聚合，其中每个桶都与一个 <em>key</em> 和一个文档标准相关联。

执行聚合时，将在上下文中的每个文档上去评估所有的桶标准，当标准匹配时，该文档将被视为“落入”相应的桶。

在聚合过程的最后，我们将得到一个桶列表——每个桶都有一组“属于”它的文档。
</dd>
<dt>
<span class="term">
<a class="xref" href="search-aggregations-metrics.html" title="metrics 聚合" rel="nofollow"><em>Metric</em></a>
</span>
</dt>
<dd>
跟踪和计算一组文档 度量(metric) 的聚合。
</dd>
<dt>
<span class="term">
<a class="xref" href="search-aggregations-matrix.html" title="Matrix Aggregations" rel="nofollow"><em>Matrix</em></a>
</span>
</dt>
<dd>
对多个字段进行操作并根据从请求的文档字段中提取的值生成 矩阵(matrix) 结果的一系列聚合。

与 metric 和 bucket 聚合不同，此聚合系列尚不支持脚本。
</dd>
<dt>
<span class="term">
<a class="xref" href="search-aggregations-pipeline.html" title="Pipeline Aggregations" rel="nofollow"><em>Pipeline</em></a>
</span>
</dt>
<dd>
聚合其他聚合的输出及其相关度量的聚合
</dd>
</dl>
</div>
<p>
接下来的部分才是有趣的。

由于每个桶都有效地定义了一个文档集(属于该桶的所有文档)，因此可以在桶级别关联聚合，这些聚合将在该桶的上下文中执行。

这就是聚合的真正威力所在：<span class="strong strong"><strong>聚合可以嵌套！</strong></span>
</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
bucketing 聚合可以有子聚合(bucketing 或 metric)。

将为其父聚合生成的桶计算子聚合。

对嵌套聚合的级别/深度没有硬性限制(可以将一个聚合嵌套在一个“父”聚合下，而这个父聚合本身是另一个更高级聚合的子聚合)。
</p>
</div>
</div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
聚合在数据的 <code class="literal">double</code> 表示法上进行操作。  

因此，在绝对值大于 <code class="literal">2^53</code> 的长整型数上运行时，结果可能是近似的。
</p>
</div>
</div>
<h2>
<a id="_structuring_aggregations"></a>构建聚合
</h2>
<p>以下代码片段体现了聚合的基本结构：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"aggregations" : {
    "&lt;aggregation_name&gt;" : {
        "&lt;aggregation_type&gt;" : {
            &lt;aggregation_body&gt;
        }
        [,"meta" : {  [&lt;meta_data_body&gt;] } ]?
        [,"aggregations" : { [&lt;sub_aggregation&gt;]+ } ]?
    }
    [,"&lt;aggregation_name_2&gt;" : { ... } ]*
}</pre>
</div>
<p>
JSON 中的 <code class="literal">aggregations</code > 对象(也可以使用 <code class="literal">aggs</code> 作为键)保存要计算的聚合。

每个聚合都与用户定义的逻辑名称(<code class="literal">&lt;aggregation_name&gt;</code>)相关联(例如，如果聚合计算平均价格，则将其命名为<code class="word">avg_price</code>是有意义的)。

这些逻辑名称还将用于唯一地标识响应中的聚合。

每个聚合都有一个特定的类型(上面代码片段中的<code class="literal">&lt;aggregation_type&gt;</code>)，并且通常是命名聚合体内的第一个键。

根据聚合的性质，每种类型的聚合定义自己的主体(例如，特定字段上的 <code class="literal">avg</code> 聚合将定义计算平均值的字段)。

在聚合类型定义的同一级别，可以选择性的定义一组附加的聚合，但这只有在你定义的聚合具有 bucketing 性质时才有意义。


在这种情况下，将为 bucketing 聚合构建的所有桶计算在 bucketing 聚合级别定义的子聚合。

例如，如果在 <code class="literal">range</code> 聚合下定义了一组聚合，将为定义的范围(range)桶计算子聚合。
</p>
<h3>
<a id="_values_source"></a>值的来源
</h3>
<p>
一些聚合处理从聚合文档中提取的值。

通常，这些值将从指定的文档字段中提取，该字段是使用聚合的 <code class="literal">field</code> 键设置的。

也可以定义一个 <a class="xref" href="modules-scripting.html" title="Scripting" rel="nofollow"><code class="literal">script</code></a> 来生成这些值(每个文档)。
</p>
<p>
当为聚合配置了 <code class="literal">field</code> 和 <code class="literal">script</code> 设置时，脚本将被视为<code class="literal">value script(值脚本)</code>。

普通脚本在文档级别进行评估(即脚本可以访问与文档相关的所有数据)，而值脚本<code class="remark">(value script)</code>在<span class="strong strong"><strong>value(值)</strong></span>级别进行评估。

在这种模式下，从已配置的 <code class="literal">field</code> 中提取值，并使用 <code class="literal">script</code> 对这些值进行“转换”。
</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<a id="aggs-script-note"></a>
<p>
使用脚本时，还可以定义 <code class="literal">lang</code> 和 <code class="literal">params</code> 设置。

前者定义了所使用的脚本语言(假设 Elasticsearch 中有合适的语言，无论是默认语言还是插件语言)。

后者支持将脚本中的所有“动态<code class="remark">(dynamic)</code>”表达式定义为参数，这使得脚本能够在调用之间保持静态<code class="remark">(static)</code>(这将确保在Elasticsearch 中使用缓存的编译过的脚本)。
</p>
</div>
</div>
<p>
Elasticsearch 使用映射(mapping)中的字段类型来确定如何运行聚合和格式化响应。

然而，在两种情况下，Elasticsearch 无法找出这些信息：未映射的字段(例如，在跨多个索引的搜索请求的情况下，只有其中一部分字段在映射中有定义) 和 纯脚本。

对于这些情况，可以使用 <code class="literal">value_type</code> 选项给 Elasticsearch 一个提示，该选项接受以下值：<code class="literal">string</code>、<code class="literal">long</code>(适用于所有整数类型)、<code class="literal">double</code>(适用于所有十进制类型，如<code class="literal">float</code>或<code class="literal">scaled_float</code>)、<code class="literal">date</code>、<code class="literal">ip</code> 和 <code class="literal">boolean</code>。
</p>
</div>
</div>









</div>
<div class="navfooter">
<span class="prev">
<!--<a href="sql-limitations.html">« SQL Limitations</a>-->
<a href="regexp-syntax.html">« 正则表达式语法</a>
</span>
<span class="next">
<a href="search-aggregations-metrics.html">度量聚合 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>